我们大家都知道STL六大组件。

STL 提供六大组件,彼此可以组合套用:

1. 容器( containers):各种数据结构,如 vector, list, deque, set, map,用来存放数据。从实作的角度看, STL 容器是一种 class template。就体积而言,这一部份很像冰山在海面下的比率。

2. 算法( algorithms):各种常用算法如 sort, search, copy, erase…,从实作的角度看, STL 算法是一种 function template。

3. 迭代器( iterators):扮演容器与算法之间的胶着剂,是所谓的「泛型指标」,共有五种类型,以及其它衍生变化。从实作的角度看,迭代器是一种将 operator*, operator->, operator++, operator-- 等指标相关操作予以多载化的 class template。所有 STL 容器都附带有自己专属的迭代器 — 是的,只有容器设计者才知道如何巡访自己的元素。原生指标( native pointer)也是一种迭代器。

4. 仿函式( functors):行为类似函式,可做为算法的某种策略( policy),从实作的角度看,仿函式是一种重载了 operator()的 class 或class template。 一般函式指标可视为狭义的仿函式。

5. 配接器( adapters): 一种用来修饰容器( containers)或仿函式( functors)或迭代器( iterators)接口的东西。例如 STL 提供的 queue 和 stack,虽然看似容器,其实只能算是一种容器配接器,因为它们的底部完全借重 deque,所有动作都由底层的 deque 供应。改变 functor 接口者,称为 function adapter,改变 container 接口者,称为 container adapter,改变iterator 界面者,称为 iterator adapter。配接器的实作技术很难一言以蔽之。

6. 配置器( allocators):负责空间配置与管理。从实作的角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的 class template

下图展示了六大组件的关系:

C++STL源码剖析篇-六大组件功能

STL 六大组件的交互关系: Container 透过 Allocator 取得数据储存空间, Algorithm 透过 Iterator 存取 Container 内容, Functor 可以协助 Algorithm 完成不同的策略变化, Adapter 可以修饰或套接 Functor。这句话看三遍!!!

由于 STL 已成为 C++ 标准链接库的大脉系,因此目前所有的 C++ 编译器一定支援有一份 STL。在哪里?就在相应的各个 C++ headers。是的, STL 并非以二进位码( binary code)面貌出现,而是以原始码面貌供应。也就是说作为读者的我们可以通过源码的方式查看STL实现方式。按 C++ Standard 的规定,所有标准表头档都不再有扩展名,但或许是为了回溯相容,或许是为了内部组织规划,某些 STL 版本同时存在具扩展名和无扩展名的两份档案,例如 VisualC++ 的 Dinkumware 版本同时具备 ;某些 STL 版本只存 在有扩展名的headers ,例 如 C++Builder 的 RaugeWave 版本 只有。某些 STL 版本不仅有一线装配,还有二线装配,例如 GNU C++ 的SGI 版本不但有一线的,还有二线的

总结:

如果只是应用 STL,请各位读者务必从此养成良好习惯,遵照 C++ 规范,使用无扩展名的headers。在接下去的文章中,探究 STL 源码,就得清楚所有这些headers的组织分布。

本页共15段,1698个字符,3455 Byte(字节)